<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h4>组合继承</h4>
  <h5>特点：</h5>
  <ul>
    <li>1、弥补了方式2的缺陷，可以继承实例属性/方法，也可以继承原型属性/方法</li>
    <li>2、既是子类的实例，也是父类的实例</li>
    <li>3、不存在引用属性共享问题</li>
    <li>4、可传参</li>
    <li>5、函数可复用</li>
  </ul>

  <h5>缺点：</h5>
  <ul>
    <li>1、调用了两次父类构造函数，生成了两份实例（子类实例将子类原型上的那份屏蔽了）（仅仅多消耗了一点内存））</li>
  </ul>
  <script>
    // 定义一个动物类
    function Animal(name) {
      // 属性
      this.name = name || 'Animal';
      // 实例方法
      this.sleep = function () {
        console.log(this.name + '正在睡觉！');
      }
    }
    // 原型方法
    Animal.prototype.eat = function (food) {
      console.log(this.name + '正在吃：' + food);
    };

    Cat.prototype.constructor = Cat;


    function Cat(name) {
      Animal.call(this);
      this.name = name || 'Tom';
    }
    Cat.prototype = new Animal();
    var cat = new Cat();
    console.dir(cat)
    console.log(cat.name);
    cat.sleep()
    cat.eat()
    console.log(cat instanceof Animal); // true
    console.log(cat instanceof Cat); // true




  </script>

</body>

</html>